package com.echo.controller;


import com.echo.dto.ScheduleDTO;
import com.echo.result.ResultVO;
import com.echo.service.IScheduleService;
import com.echo.vo.ScheduleChangeVo;
import com.echo.vo.ScheduleVo;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.util.List;

/**
 * <p>
 * 存储计划总体信息的主表 前端控制器
 * </p>
 *
 * @author echo
 * @since 2024-11-13
 */


//日程管理要写什么呢？
//1.前端在展示：一个日历，然后找到对应天的计划【可以手动+ai生成】
//2.然后可以进行勾选，如果没有完成的话，那么到点会进行提醒
// 【可以设置每一个任务的提醒时间，如果到点还没有完成的话则会弹窗提醒】
//3.点击某天可以展示当天的计划
// 然后在这个页面也可以有一个生成计划的接口，方便直接生成计划。

//1.创建计划
//计划包括：1.计划的内容，计划的标题，时间，提醒时间，开始时间、结束时间，完成状态
//      计划的日期：这里来一个多表关联，

//2.获取
@RestController
@RequestMapping("api/schedule")
public class ScheduleController {
    @Autowired
    private IScheduleService scheduleService;
    //1.创建日程
    //前端传来的格式要注意
    //1.dataList: ["2024-11-13", "2024-11-14", "2024-11-15"]  【这种数组的形式】
    //2. remindtime："10:10:10"  时分秒

    //这里的每一个日程，都是一个事件，然后这里可以去设置
    @PostMapping("/creatSchedule")
    @Operation(summary = "创建日程")
    ResultVO<ScheduleVo> creatSchedule(@RequestBody ScheduleDTO scheduleDTO){
        // 这里去接收传来的
        System.out.println(scheduleDTO);
        scheduleService.creatSchedule(scheduleDTO);
        return new ResultVO<>(0,"创建成功",null);
    }
    @PostMapping("/creatListSchedule")
    @Operation(summary ="将ai生成的日程存入数据库")
    ResultVO<ScheduleVo> creatSchedule(@RequestBody List<ScheduleDTO> scheduleDTOList ){
        for (ScheduleDTO scheduleDTO : scheduleDTOList) {
            scheduleService.creatSchedule(scheduleDTO);
        }
        return new ResultVO<>(0,"创建成功",null);
    }

    //2.传过来某一天展示当天的所有计划，这里可以看出一个日程为一个事件
    //这里查询的是所有的状态的，所以前端可以对status加以标记
    @PostMapping("/getDaySchedule")
    @Operation(summary ="根据日期得到当日日程")
    ResultVO<List<ScheduleVo>> getDaySchedule(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate localDate){
        try{
            List<ScheduleVo> scheduleVo=  scheduleService.getDaySchedule(localDate);
            return new ResultVO<>(0,"获得日程成功",scheduleVo);
        }catch (Exception e){
            return new ResultVO<>(0,"当日没有日程",null);
        }
    }
    @PostMapping("/changeDaySchedule")
    @Operation(summary ="修改某天的日程计划")
    ResultVO<List<ScheduleVo>> changeDaySchedule(@RequestBody ScheduleChangeVo scheduleChangeVo){
        System.out.println(scheduleChangeVo);
        scheduleService.changeDaySchedule(scheduleChangeVo);
        return new ResultVO<>(0,"修改成功",null);
    }

    //3.点击即可 生成【这里要不要选择呢 根据什么计划去，2.最近的考试记录？
    // ai生成的计划并加入日程
    //
    @GetMapping("/generateAiSchedule")
    @Operation(summary ="ai生成的计划并返回给前端")
    ResultVO<List<ScheduleDTO> > generateAiSchedule(@RequestParam String type) throws JsonProcessingException {
        List<ScheduleDTO> scheduleDTOList= scheduleService.generateAiSchedule(type);
        for (ScheduleDTO scheduleDTO : scheduleDTOList) {
            scheduleService.creatSchedule(scheduleDTO);
        }
        //todo: 这里去用一个面版去展示这些计划，也就是还没进入数据库，可以让用户进行修改
        return new ResultVO<>(0,"创建成功",scheduleDTOList);
    }

    //修改任务状态,传id，可以修改状态，传来要修改成的状态，会取相反的状态的
    @GetMapping("/changeScheduleStatus")
    @Operation(summary ="修改日程的状态")
    ResultVO<ScheduleVo> changeScheduleStatus(@RequestParam String scheduleId) throws JsonProcessingException {
        scheduleService.changeSchedule(scheduleId);
        return new ResultVO<>(0,"修改成功",null);
    }
    //todo：5. 提醒功能
    

    //2.催促一下时间轴，这次放假要把 数据格式+日程弄完
    //图片问题
    // 之后还有ai聊天【流式
    // 做题时的美化+首页要写
}
